home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2007 December / PCWKCD1207B.iso / + TYLKO W WERSJI CYFROWEJ + / PCWK_PROG / Source / 120 / ukryte2 / fukryte2.cpp next >
C/C++ Source or Header  |  2007-07-05  |  7KB  |  234 lines

  1. //
  2. //  Andrzej Stasiewicz, czerwiec, 2007
  3. //  Ukrywanie obrazu w obrazie
  4. //  Oszacowanie miejsca w tajnym schowku
  5. //  Wpisanie obrazu w m│odsze bity obrazu - no£nika
  6. //
  7. //---------------------------------------------------------------------------
  8. #include <vcl.h>
  9. #pragma hdrstop
  10.  
  11. #include "fukryte2.h"
  12. //---------------------------------------------------------------------------
  13. #pragma package(smart_init)
  14. #pragma resource "*.dfm"
  15. TForm1 *Form1;
  16. //---------------------------------------------------------------------------
  17. __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
  18. {
  19.  il_r = il_g = il_b = 3;            //stan pocz╣tkowy pojemno£ci schowka uzgodniono z edytorkami
  20. }
  21. //---------------------------------------------------------------------------
  22. //  Odczyt pliku, wy£wietlenie z lewej strony, wyr≤wnanie parametr≤w
  23. //  obrazu docelowego, oszacowanie pojemno£ci schowka
  24. void __fastcall TForm1::Button1Click(TObject *Sender)
  25. {
  26.  if( OpenPictureDialog1 -> Execute())
  27.  {
  28.     Image1 -> Picture -> LoadFromFile( OpenPictureDialog1 -> FileName);
  29.     Image1 -> Picture -> Bitmap -> PixelFormat = pf32bit;
  30.     Image3 -> Picture -> Bitmap -> PixelFormat = pf32bit;
  31.     int szer = Image1 -> Picture -> Bitmap -> Width;
  32.     int wys  = Image1 -> Picture -> Bitmap -> Height;
  33.     Image3 -> Picture -> Bitmap -> Width = szer;    
  34.     Image3 -> Picture -> Bitmap -> Height = wys;
  35.  
  36.     int rozmiar = szer * wys * ( il_r + il_g + il_b) / 8;
  37.     Label4 -> Caption = "Przestrze± dostΩpna: " + String( rozmiar);
  38.  }    
  39. }
  40. //---------------------------------------------------------------------------
  41. //  Odczyt pliku ukrywanego, wykazanie jego rozmiaru
  42. void __fastcall TForm1::Button2Click(TObject *Sender)
  43. {
  44.  if( OpenPictureDialog1 -> Execute())
  45.  {
  46.     Image2 -> Picture -> LoadFromFile( OpenPictureDialog1 -> FileName);
  47.     Image2 -> Picture -> Bitmap -> PixelFormat = pf32bit;
  48.  
  49.     int szer = Image2 -> Picture -> Bitmap -> Width;
  50.     int wys  = Image2 -> Picture -> Bitmap -> Height;
  51.     int rozmiar = szer * wys * 4;
  52.  
  53.     Label5 -> Caption = "Przestrze± wymagana: " + String( rozmiar);
  54.  }    
  55. }
  56. //---------------------------------------------------------------------------
  57. //  Oszacowanie dostΩpnej przestrzeni
  58. //  Ukrywanie obrazka Image2 w obrazku Image1 
  59. //  i pokazanie wyniku w Image3.
  60. //  Najpierw Image1 jest kopiowany do Image3.
  61. //  Potem okre£lone bity Image3 s╣ modyfikowane.
  62. void __fastcall TForm1::Button3Click(TObject *Sender)
  63. {
  64.  Image3 -> Picture -> Bitmap = Image1 -> Picture -> Bitmap;
  65.  int i, j, n, szer, wys;
  66.  TColor k;
  67.  unsigned char r, g, b;
  68.  int val;
  69.  
  70.  X_POZ = 0;                     //start
  71.  Y_POZ = 0;
  72.  RGB_POZ = 0;
  73.  BIT_POZ = 0;
  74.  
  75.  szer = Image2 -> Picture -> Bitmap -> Width;
  76.  wys  = Image2 -> Picture -> Bitmap -> Height;
  77.  for( i = 0; i < szer; ++i)
  78.  {
  79.     for( j = 0; j < wys; ++j)
  80.     {
  81.         k = Image2 -> Picture -> Bitmap -> Canvas -> Pixels[ i][ j];
  82.  
  83.         r = GetRValue( k);
  84.         for( n = 0; n < 8; ++n)
  85.         {
  86.             val = daj_bit( r, n);
  87.             if( !zapisz_bit( val))
  88.                 return;
  89.         }
  90.  
  91.         g = GetGValue( k);
  92.         for( n = 0; n < 8; ++n)
  93.         {
  94.             val = daj_bit( g, n);
  95.             if( !zapisz_bit( val))
  96.                 return;
  97.         }
  98.  
  99.         b = GetBValue( k);
  100.         for( n = 0; n < 8; ++n)
  101.         {
  102.             val = daj_bit( b, n);
  103.             if( !zapisz_bit( val))
  104.                 return;
  105.         }
  106.     }
  107.  }
  108. }
  109. //---------------------------------------------------------------------------
  110. //  Zapis ostatecznego obrazka do pliku
  111. void __fastcall TForm1::Button4Click(TObject *Sender)
  112. {
  113.  if( SavePictureDialog1 -> Execute())
  114.  {
  115.     Image3 -> Picture -> SaveToFile( SavePictureDialog1 -> FileName);
  116.  }    
  117. }
  118. //---------------------------------------------------------------------------
  119. //  oddaj stan 0, 1, zgodnie z bitem poz w bajcie bajt
  120. int TForm1 :: daj_bit( unsigned char bajt, int poz)
  121. {
  122.  int ret;
  123.  unsigned char maska[ 8] = {1, 2, 4, 8, 16, 32, 64, 128};   //'1', '10', '100', '1000', ...
  124.  
  125.  if( bajt & maska[ poz])
  126.     ret = 1;
  127.  else
  128.     ret = 0;
  129.  return ret;
  130. }
  131. //---------------------------------------------------------------------------
  132. //  Funkcja elementarna.
  133. //  W bajcie 'bajt' nadaj bitowi 'poz' wartosc 'bit'
  134. unsigned char TForm1 :: ustaw_bit( unsigned char bajt, int poz, int bit)
  135. {
  136.  unsigned char maska[ 8] = {1, 2, 4, 8, 16, 32, 64, 128};   //'1', '10', '100', '1000', ...
  137.  
  138.  if( bit == 1)          //wpisywanie jedynki
  139.  {
  140.     bajt = bajt | maska[ poz];
  141.  }
  142.  else
  143.  {
  144.     bajt = bajt & (~maska[ poz]);
  145.  }
  146.  return bajt;
  147. }
  148. //---------------------------------------------------------------------------
  149. //  Zapisz wartosc bit (=0, 1) w bie┐╣cym bicie obrazka g│≤wnego Image3
  150. //  (kt≤ry jest kopi╣ Image1)
  151. //  Dokonaj przesuniΩcia wskaƒnik≤w pozycji bie┐╣cego bitu w Image3
  152. //  return: true - zapisano, 
  153. //          false - koniec obrazka g│≤wnego.
  154. bool TForm1 :: zapisz_bit( int bit)
  155. {
  156.  int szer = Image3 -> Picture -> Bitmap -> Width;
  157.  int wys  = Image3 -> Picture -> Bitmap -> Height;
  158.  
  159.  if( Y_POZ > wys)
  160.     return false;                       //koniec przestrzeni do zapisu
  161.    
  162.  TColor k = Image3 -> Picture -> Bitmap -> Canvas -> Pixels[ X_POZ][ Y_POZ];
  163.  unsigned char r = GetRValue( k);
  164.  unsigned char g = GetGValue( k);
  165.  unsigned char b = GetBValue( k);
  166.  
  167.  switch( RGB_POZ)
  168.  {
  169.   case 0:
  170.             r = ustaw_bit( r, BIT_POZ, bit);
  171.             break;
  172.   case 1:
  173.             g = ustaw_bit( g, BIT_POZ, bit);
  174.             break;
  175.   case 2:
  176.             b = ustaw_bit( b, BIT_POZ, bit);
  177.             break;
  178.  }
  179.  k = RGB( r, g, b);
  180.  Image3 -> Picture -> Bitmap -> Canvas -> Pixels[ X_POZ][ Y_POZ] = k;
  181.  
  182.  BIT_POZ ++;                        //nastΩpny wskaƒniki na nastΩpny bit ...
  183.  
  184.  if( RGB_POZ == 0)                  //... ale czy mie£ci siΩ w kanale R?
  185.  {
  186.     if( BIT_POZ >= il_r)
  187.     {
  188.         BIT_POZ = 0;
  189.         RGB_POZ = 1;                //... je£li nie, przejdƒmy do kana│u G...
  190.     }
  191.  }
  192.  
  193.  if( RGB_POZ == 1)                  //... ale czy mie£ci siΩ w kanale G? ...
  194.  {
  195.     if( BIT_POZ >= il_g)
  196.     {
  197.         BIT_POZ = 0;
  198.         RGB_POZ = 2;                //... je£li nie, przejdƒmy do kana│u B ...
  199.     }
  200.  }
  201.  
  202.  if( RGB_POZ == 2)                  //... ale czy mie£ci siΩ w kanale B? ...
  203.  {
  204.     if( BIT_POZ >= il_b)
  205.     {
  206.         BIT_POZ = 0;
  207.         RGB_POZ = 0; 
  208.         X_POZ ++;                   //... je£li nie, przejdƒmy do nastΩpnego piksela
  209.         if( X_POZ >= szer)
  210.         {
  211.             X_POZ = 0;
  212.             Y_POZ ++;
  213.         }
  214.     }
  215.  }
  216.  return true;
  217. }
  218. //---------------------------------------------------------------------------
  219. //  Zmieniono nastawy edytork≤w - rozmiar≤w schowka
  220. void __fastcall TForm1::Edit3Exit(TObject *Sender)
  221. {
  222.  il_r = Edit1 -> Text.ToInt(),
  223.  il_g = Edit2 -> Text.ToInt(),
  224.  il_b = Edit3 -> Text.ToInt();
  225.  
  226.  int szer = Image1 -> Picture -> Bitmap -> Width;
  227.  int wys  = Image1 -> Picture -> Bitmap -> Height;
  228.  int rozmiar = szer * wys * ( il_r + il_g + il_b) / 8;
  229.  
  230.  Label4 -> Caption = "Przestrze± dostΩpna: " + String( rozmiar);
  231. }
  232. //---------------------------------------------------------------------------
  233.  
  234.